
///////////////////////////////////////////////////////////////////////////////
//
// Module Name:
//   CmsiHTTPClientCommon.h
//
// Abstract: Coomon structs and types for the HTTP protocol API
// Author:	Eitan Michaelso
// Version:  1.0
//
///////////////////////////////////////////////////////////////////////////////

#ifndef _HTTPCLIENT_PROTOCOL_H_
#define _HTTPCLIENT_PROTOCOL_H_

#ifdef __cplusplus
extern "C" {
#endif

// Global default sizes
#define HTTP_CLIENT_MAX_URL_LENGTH              512	// Maximum length for an HTTP Url parameter

// HTTP Session flags (Public flags)
#define HTTP_CLIENT_FLAG_KEEP_ALIVE             0x00000001	// Set the keep alive header
#define HTTP_CLIENT_FLAG_SEND_CHUNKED           0x00000002	// The outgoing should chunked
#define HTTP_CLIENT_FLAG_NO_CACHE               0x00000004	// Set the no cache header
#define HTTP_CLIENT_FLAG_ASYNC                  0x00000008	// Currently not implemented
#define HTTP_CLIENT_FLAG_HEADER_EXTENSION       0x10000000	// Currently not implemented

// HTTP status internal flags
#define HTTP_CLIENT_STATE_PRE_INIT              0x00000000	// Starting stage
#define HTTP_CLIENT_STATE_INIT                  0x00000001	// API was initialized (memory was allocated)
#define HTTP_CLIENT_STATE_URL_PARSED            0x00000002	// Url was parsed
#define HTTP_CLIENT_STATE_HOST_CONNECTED        0x00000004	// HEAD verb was sent
#define HTTP_CLIENT_STATE_HEAD_SENT             0x00000008	// Post verb was sent
#define HTTP_CLIENT_STATE_POST_SENT             0x00000010	// HTTP requet was sent
#define HTTP_CLIENT_STATE_REQUEST_SENT          0x00000020	// HTTP request was sent
#define HTTP_CLIENT_STATE_HEADERS_RECIVED       0x00000040	// Headers ware recived from the server
#define HTTP_CLIENT_STATE_HEADERS_PARSED        0x00000080	// HTTP headers ware parsed
#define HTTP_CLIENT_STATE_HEADERS_OK            0x00000100	// Headers  status was OK

// HTTP Return codes
#define HTTP_CLIENT_SUCCESS                 0 // HTTP Success status

#define HTTP_CLIENT_UNKNOWN_ERROR           1 // Unknown error
#define HTTP_CLIENT_ERROR_INVALID_HANDLE    2  // an Invalid handle or possible bad pointer was passed to a function
#define HTTP_CLIENT_ERROR_NO_MEMORY         3  // Buffer too small or a failure while in memory allocation
#define HTTP_CLIENT_ERROR_SOCKET_INVALID    4  // an attempt to use an invalid socket handle was made
#define HTTP_CLIENT_ERROR_SOCKET_CANT_SET   5  // Can't send socket parameters
#define HTTP_CLIENT_ERROR_SOCKET_RESOLVE    6  // Error while resolving host name
#define HTTP_CLIENT_ERROR_SOCKET_CONNECT    7  // Error while connecting to the remote server
#define HTTP_CLIENT_ERROR_SOCKET_TIME_OUT   8  // socket time out error
#define HTTP_CLIENT_ERROR_SOCKET_RECV       9  // Error while receiving data
#define HTTP_CLIENT_ERROR_SOCKET_SEND       10 // Error while sending data
#define HTTP_CLIENT_ERROR_HEADER_RECV       11 // Error while receiving the remote HTTP headers
#define HTTP_CLIENT_ERROR_HEADER_NOT_FOUND  12 // Could not find element within header
#define HTTP_CLIENT_ERROR_HEADER_BIG_CLUE   13 // The headers search clue was too large for the internal API buffer
#define HTTP_CLIENT_ERROR_HEADER_NO_LENGTH  14 // No content length was specified for the outgoing data. the caller should specify chunking mode in the session creation
#define HTTP_CLIENT_ERROR_CHUNK_TOO_BIG     15 // The HTTP chunk token that was received from the server was too big and possibly wrong
#define HTTP_CLIENT_ERROR_AUTH_HOST         16 // Could not authenticate with the remote host
#define HTTP_CLIENT_ERROR_AUTH_PROXY        17 // Could not authenticate with the remote proxy
#define HTTP_CLIENT_ERROR_BAD_VERB          18 // Bad or not supported HTTP verb was passed to a function
#define HTTP_CLIENT_ERROR_LONG_INPUT        19 // a function received a parameter that was too large
#define HTTP_CLIENT_ERROR_BAD_STATE         20 // The session state prevents the current function from proceeding
#define HTTP_CLIENT_ERROR_CHUNK             21 // Could not parse the chunk length while in chunked transfer
#define HTTP_CLIENT_ERROR_BAD_URL           22 // Could not parse curtail elements from the URL (such as the host name, HTTP prefix act')
#define HTTP_CLIENT_ERROR_BAD_HEADER        23 // Could not detect key elements in the received headers
#define HTTP_CLIENT_ERROR_BUFFER_RSIZE      24 // Error while attempting to resize a buffer
#define HTTP_CLIENT_ERROR_BAD_AUTH          25 // Authentication schema is not supported
#define HTTP_CLIENT_ERROR_AUTH_MISMATCH     26 // The selected authentication schema does not match the server response
#define HTTP_CLIENT_ERROR_NO_DIGEST_TOKEN   27 // an element was missing while parsing the digest authentication challenge
#define HTTP_CLIENT_ERROR_NO_DIGEST_ALG     28 // Digest algorithem could be MD5 or MD5-sess other types are not supported
#define HTTP_CLIENT_ERROR_SOCKET_BIND       29 // Binding error
#define HTTP_CLIENT_ERROR_TLS_NEGO          30 // Tls negotiation error
#define HTTP_CLIENT_ERROR_NOT_IMPLEMENTED   64 // Feature is not (yet) implemented
#define HTTP_CLIENT_EOS                     1000        // HTTP end of stream message

///////////////////////////////////////////////////////////////////////////////
//
// Section      : HTTP API structures
// Last updated : 01/09/2005
//
///////////////////////////////////////////////////////////////////////////////

// HTTP Supported authentication methods
typedef enum _HTTP_AUTH_SCHEMA
{
	AuthSchemaNone = 0,
	AuthSchemaBasic,
	AuthSchemaDigest,
	AuthSchemaKerberos,
	AuthNotSupported

} HTTP_AUTH_SCHEMA;

// HTTP supported verbs
typedef enum _HTTP_VERB
	{
		VerbGet = 0,
		VerbHead,
		VerbPost,
		VerbNotSupported
		// Note: others verb such as connect and put are currently not supported

} HTTP_VERB;
#ifdef HTTP_GET_REDIRECT_URL
typedef struct _HTTP_REDIRECT_PARAM
{
        CHAR                *pParam;
        UINT32              nLength;

} HTTP_REDIRECT_PARAM;
#endif
// Data structure that the caller can request at any time that will include some information regarding the session
typedef struct _HTTP_CLIENT
{
	UINT32 HTTPStatusCode;	// HTTP Status code (200 OK)
	UINT32 RequestBodyLengthSent;	// Total bytes sent (body only)
	UINT32 ResponseBodyLengthReceived;	// Total bytes received (body only)
	UINT32 TotalResponseBodyLength;	// as extracted from the content-length" header
	UINT32 HttpState;
#ifdef HTTP_GET_REDIRECT_URL
	HTTP_REDIRECT_PARAM *RedirectUrl;
#endif
#ifdef HTTP_GET_HANDLE_FLAGS
	UINT32 HttpFlags;
#endif
} HTTP_CLIENT;

#endif // _HTTPCLIENT_PROTOCOL_H_
